#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

// pid_t fork(void);
// pid_t getpid(void);
// pid_t getppid(void);
// pid_t wait(int *status);
// exit()清空缓冲区    /_Exit() / _exit()不会清空缓冲区
int main()
{

    printf("main \n");

    pid_t pid = fork();

    if (pid == -1)
    {
        printf("创建进程失败 \n");
    }

    if (pid == 0) // 子进程
    {
        int count = 0;
        while (count < 30)
        {
            printf("child %d\n", count);
            pause(); // 等待信号
            count++;
        }
    }

    if (pid > 0) // 父进程
    {
        printf("parent hello 父pid=%d  父父ppid=%d  子fork->pid=%d\n", getpid(), getppid(), pid);

        // wait(NULL);
        // printf("1111\n");

        int status;
        waitpid(0, &status, WUNTRACED);
        printf("111 %d %d | %d %d | %d %d\n", WIFEXITED(status), WEXITSTATUS(status), WIFSIGNALED(status), WTERMSIG(status), WIFSTOPPED(status), WSTOPSIG(status));
    }

    // kill -9 pid  SIGSTOP=19 SIGCONT=18  SIGKILL=9

    return 0;
}

// pid_t waitpid(pid_t pid, int *wstatus, int options);
// pid: 等待的子进程的进程号。如果为 -1，则等待任意子进程。
// wstatus: 存储子进程退出状态信息的指针。
// options: 控制 waitpid() 行为的标志。
// WNOHANG: 非阻塞模式。如果没有子进程退出，就立即返回 0，而不是阻塞等待。
// WUNTRACED: 也返回那些已经停止（但未终止）的子进程信息（例如，被 SIGSTOP 信号暂停）。
// WCONTINUED: 也返回那些曾被停止、后又继续运行的子进程信息。